/**
 * ImpresorHTML.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.negocios;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.Date;
import adsec.entidades.Materia;


public class ImpresorHTML {
    private String fileName;
    private String nombreLiceo = "Liceo Escazú";
    
    public ImpresorHTML(){
        fileName = "";
    }

    public String imprimirHTML(){
        String resultado = "";
        if(this.verificarDatos()){
            try{
                OutputStreamWriter escritor = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8");
                resultado = encabezadoHTML + inicioHeadHTML + styleHTML + finHeadHTML +
                        inicioBodyHTML + encabezado + seccionReporteHogar + datosEstudiante +
                        seccionReporteNotas + this.obtenerTabla(Materia.NORMAL) +
                        seccionRepNotasTecnologia + this.obtenerTabla(Materia.TECNOLOGIA)+
                        seccionRepNotasEspeciales + this.obtenerTabla(Materia.ESPECIAL) + seccionReporteAsistencia + inicioTableAsistenciaHTML + headerAsistencia +
                        this.filaAsistencia.toString() + finTableHTML +
                        seccionReporteAplazados + inicioTableAplazadosHTML + headerAplazados +
                        this.filaAplazados.toString() + finTableHTML +
                        footer + finHTML;
                
                escritor.write(resultado);
                escritor.flush();
                escritor.close();
            }catch(Exception e){
                resultado = "<html><body><p>Ocurrió una excepción</p></body></html>";
                e.printStackTrace();
            }
        }else{
            resultado = resultado = "<html><body><p>No se ha especificado la ruta del archivo de salida</p></body></html>";
        }
        return resultado;
    }//fin de imprimirHTML

    private String obtenerTabla(int tipoMateria){
        String tabla = "No hay notas registradas";
        String headers = null;
        StringBuffer fila = null;
        switch(tipoMateria){
            case Materia.NORMAL:
                headers = headerNotasNormales;
                fila  = filaNotasNormales;
                break;
            case Materia.TECNOLOGIA:
                headers = headerNotasTecnologias;
                fila = filaNotasTecnologias;
                break;
            case Materia.ESPECIAL:
                headers = headerNotasEspeciales;
                fila = filaNotasEspeciales;
                break;
        }
        if(headers != null && headers.length() > 0){
            tabla = inicioTableNotasHTML + headers + fila.toString() + finTableHTML;
        }
        return tabla;
    }

    private boolean verificarDatos(){
        boolean resultado = fileName != null && fileName.length() > 0;
        return resultado;
    }//fin de verificarDatos

    public void limpiarDatos(){
        this.datosEstudiante = "";
        this.headerNotasNormales = "";
        this.headerAsistencia = "";
        this.filaNotasNormales = new StringBuffer();
        this.filaAsistencia = new StringBuffer();
        this.filaAplazados = new StringBuffer();
        
    }//fin de limpiarDatos

    /**
     * @return the fileName
     */
    public String getFileName() {
        return fileName;
    }

    /**
     * @param fileName the fileName to set
     */
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public void agregarDatosEstudiante(String cedula, String nombre, String nivel){
        if( cedula == null){
            cedula = "";
        }
        if( nombre == null){
            nombre = "";
        }
        datosEstudiante = "<div class=\"datosEstudiante\">\n"+
        	"<div style=\"width: 30%; float: left; \"><span style=\"font-weight:bold\">" +
            "Cédula: </span> " + cedula +"</div>\n"+
            "<div style=\"width: 45%; float: left; \"><span style=\"font-weight:bold\">Nombre: </span> " +
            nombre +"</div>\n" + "<div ><span style=\"font-weight:bold\">Nivel: </span> " +
            nivel + "</div>\n</div>\n";
    }//fin de rellenarDatosEstudiante

    public void agregarHeaderNotas(String [] header, int tipoMateria){
        StringBuffer buffer = new StringBuffer();
        buffer.append("<tr class=\"filaEncabezado\" align=\"center\">\n");
        for(int indice = 0; indice < header.length; indice++){
            buffer.append("<td>" + (header[indice] != null ? header[indice] : "") + "</td>\n");
        }//fin de for
        buffer.append("</tr>\n");
        switch(tipoMateria){
            case Materia.NORMAL:
                this.headerNotasNormales = buffer.toString();
                break;
            case Materia.TECNOLOGIA:
                this.headerNotasTecnologias = buffer.toString();
                break;
            case Materia.ESPECIAL:
                this.headerNotasEspeciales = buffer.toString();
                break;
        }
    }//fin de agregarHeaderNotas

    public void agregarFilaNotas(String [] filaReporteNotas, int tipoMateria){
        StringBuffer filaNotas = null;
        switch(tipoMateria){
            case Materia.NORMAL:
                filaNotas = filaNotasNormales;
                break;
            case Materia.TECNOLOGIA:
                filaNotas = filaNotasTecnologias;
                break;
            case Materia.ESPECIAL:
                filaNotas = filaNotasEspeciales;
                break;
        }
        filaNotas.append("<tr align=\"center\">\n");
        for(int indice = 0; indice < filaReporteNotas.length; indice++){
            filaNotas.append("<td>" + (filaReporteNotas[indice] != null ? filaReporteNotas[indice] : "") + "</td>\n");
        }//fin de for
        filaNotas.append("</tr>\n");
    }//fin de agregarFilaNotas

    public void agregarHeaderAsistencia(String [] header){
        StringBuffer buffer = new StringBuffer();
        buffer.append("<tr class=\"filaEncabezado\" align=\"center\">\n");
        for(int indice = 0; indice < header.length; indice++){
            buffer.append("<td>" + (header[indice] != null ? header[indice] : "") + "</td>\n");
        }//fin de for
        buffer.append("</tr>\n");
        this.headerAsistencia = buffer.toString();
    }//fin de agregarHeaderAsistencia

    public void agregarFilaAsistencia(String [] filaReporteAsistencia){
        filaAsistencia.append("<tr align=\"center\">\n");
        filaAsistencia.append("<td class=\"negrita\">" + filaReporteAsistencia[0] + "</td>\n");
        for(int indice = 1; indice < filaReporteAsistencia.length; indice++){
            filaAsistencia.append("<td>" + (filaReporteAsistencia[indice] != null ? filaReporteAsistencia[indice] : "")+ "</td>\n");
        }//fin de for
        filaAsistencia.append("</tr>\n");
    }//fin de agregarFilaAsistencia

    public void agregarFilaAplazados(String [] filaReporteAplazados){
        filaAplazados.append("<tr align=\"center\">\n");
        for(int indice = 0; indice < filaReporteAplazados.length; indice++){
            filaAplazados.append("<td>" + (filaReporteAplazados[indice] != null ? filaReporteAplazados[indice] : "") + "</td>\n");
        }//fin de for
        filaAplazados.append("</tr>\n");
    }//fin de agregarFilaAsistencia

    //TODO: terminar de agregar las partes constantes del HTML
    //Sección con los Strings constantes para las secciones del HTML:
    private final String encabezadoHTML =
    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" +
    "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"+
    "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"es\" lang=\"es\">";

    private final String inicioHeadHTML =
    "<head>\n"+
    "<meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" />\n"+
    "<title>Informe al Hogar</title>";

    private final String finHeadHTML = "</head>";

    private final String styleHTML =
    "<style type=\"text/css\">\n"+
	"body {\nheight:100%;\npadding-left:5%;\npadding-right:5%;\nfont-size: x-small;\n}\n"+
	"div.padre{\nwidth:100%;\nheight:100%;\n}\n" +
	"div.encabezado{\nclear: both;\nfont-weight: bold;\n}\n" +
	"p.liceo{\nfont-style: italic;\nfont-size: large;\ncolor: #191970;\n}\n" +
	"p.tituloSeccion{\nfont-size: small;\ncolor: #708090;\nfont-weight: bold;\n}\n" +
	"div.datosEstudiante{\nfont-family: \"Comic Sans MS\", cursive;\nfont-size: x-small;\n" +
    "border-style: solid;\nborder-color: #191970;\nborder-width: thin;\nwidth: 98%;\npadding-left: 2%;\n}\n" +
	"div.cajaInforme {\nborder-style: solid;\nborder-color: #191970;\nborder-width: thin;\n" +
	"padding-left: 5%;\npadding-right: 5%;\npadding-bottom: 2%;\npadding-top: 2%;\n}" +
	".filaEncabezado{\nfont-weight: bold;\nbackground-color: #B0C4DE;\n}\n" +
	".negrita{\nfont-weight: bold;\n}\n</style>";

    private final String inicioBodyHTML = "<body>\n<div style=\"width:100%; height:100%; \">\n";

    private final String encabezado = "<div class=\"encabezado\">\n"+
			"<p class=\"liceo\">"+ this.nombreLiceo +"</p>\n</div>\n";

    private final String seccionReporteHogar = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Reporte al Hogar</p>\n</div>\n";

    private final String seccionReporteNotas = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Reporte de Notas por Materia</p>\n</div>\n";
    private final String seccionRepNotasTecnologia = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Tecnologías</p>\n</div>\n";
    private final String seccionRepNotasEspeciales = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Especiales</p>\n</div>\n";

    private final String inicioTableNotasHTML = "<table cellpadding=\"1\" border=\"2\" style=\"width:100%;\">";

    private final String seccionReporteAsistencia = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Reporte de Asistencia</p>\n</div>\n";

    private final String inicioTableAsistenciaHTML = "<table cellpadding=\"1\" border=\"2\" style=\"width:45%;\">";

    private final String seccionReporteAplazados = "<div>\n"+
        	"<p class=\"tituloSeccion\"> Materias Aplazadas</p>\n</div>\n";

    private final String inicioTableAplazadosHTML = "<table cellpadding=\"1\" border=\"2\" style=\"width:100%;\">";

    private final String headerAplazados = "<tr class=\"filaEncabezado\" align=\"center\">\n"+
                "<td>Nivel</td>\n" + "<td>Sección</td>\n" + "<td>Materia</td>\n" +
                "<td>Nota Conv. 1</td>\n" + "<td>Estado</td>\n" + "<td>Nota Conv. 2</td>\n" +
                "<td>Estado</td>\n" + "</tr>\n";
    
    private final String finTableHTML = "</table>";

    private final String footer = "<br/>\n<div class=\"datosEstudiante\">\n"+
        	"<p> <span style=\"font-weight:bold\">Fecha: </span>"+ UtilidadesCapaNegocios.obtenerStringFecha(new Date(System.currentTimeMillis())) +"</p>\n"+
            "<p> <span style=\"font-weight:bold\">Director(a): </span> ____________________________________________</p>\n"+
            "<p> <span style=\"font-weight:bold\">Firma Responsable: </span> ____________________________________________</p>\n"+
            "</div>\n";
    
    private final String finHTML = "</div>\n</body>\n</html>\n";

    //Atributos para las partes variables:
    private String datosEstudiante = "";
    
    private String headerNotasNormales = "";

    private StringBuffer filaNotasNormales = new StringBuffer();

    private String headerNotasTecnologias = "";

    private StringBuffer filaNotasTecnologias = new StringBuffer();

    private String headerNotasEspeciales = "";

    private StringBuffer filaNotasEspeciales = new StringBuffer();

    private String headerAsistencia = "";

    private StringBuffer filaAsistencia = new StringBuffer();

    private StringBuffer filaAplazados = new StringBuffer();

}//fin de clase ImpresorHTML
